package com.pronosticnews.server.services;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.dozer.Mapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.pronosticnews.client.services.SaisonService;
import com.pronosticnews.server.domain.dao.JourneeDao;
import com.pronosticnews.server.domain.dao.ParticipationDao;
import com.pronosticnews.server.domain.dao.PartieDao;
import com.pronosticnews.server.domain.dao.SaisonDao;
import com.pronosticnews.server.domain.model.Club;
import com.pronosticnews.server.domain.model.Journee;
import com.pronosticnews.server.domain.model.Participation;
import com.pronosticnews.server.domain.model.Partie;
import com.pronosticnews.server.domain.model.Saison;
import com.pronosticnews.shared.model.ClubDto;
import com.pronosticnews.shared.model.SaisonDto;

import fr.ysa.persistence.DaoException;
import fr.ysa.persistence.IDao;
import fr.ysa.services.ImplService;
import fr.ysa.services.ServiceException;

@Service("saisonService")
@Transactional
public class SaisonServiceImpl extends ImplService<Saison, SaisonDto> implements
		SaisonService {

	@Autowired
	JourneeDao journeeDao;
	
	@Autowired
	SaisonDao saisonDao;

	@Autowired
	ParticipationDao participationDao;

	@Autowired
	PartieDao partieDao;

	@Autowired
	Mapper mapper;

	@Override
	public IDao<Saison> getDao() {
		return saisonDao;
	}

	@Override
	public Class<Saison> getEntityClass() {
		return Saison.class;
	}

	@Override
	public Class<SaisonDto> getEntityDtoClass() {
		return SaisonDto.class;
	}

	@Override
	public SaisonDto sauvegarder(SaisonDto saison) throws ServiceException {
		int nbClubs = saison.getClubsParticipants().size();
		if ((nbClubs % 2) == 0) {
			try {
				//save saison
				SaisonDto savedSaison = super.sauvegarder(saison);
				
				//save participations clubs
				
				List<Participation> participations = new ArrayList<Participation>();
				Participation participation = null;
				for (ClubDto club : saison.getClubsParticipants()) {
					Club mappedClub = mapper.map(club, Club.class);
					Saison mappedSaison = mapper.map(savedSaison, Saison.class);
					
					participation = new Participation();
					participation.setClub(mappedClub);
					participation.setSaison(mappedSaison);
					participations.add(participation);
					
				}
				participationDao.sauvegarder(participations);
				
				
				
				
				//creer les journees 
				int nbJournees = (nbClubs * 2) -2;
				int nbPartiesJournee = nbClubs / 2;
				Journee journee = null;
				List<Journee> journees = new ArrayList<Journee>();
				for (int i = 0; i < nbJournees; i++) {
					journee = new Journee();
					journee.setNumeroOrdre(i+1);
					journee.setSaison(mapper.map(savedSaison, Saison.class));
					journees.add(journee);
				}
				
				Collection<Journee> savedJournees = journeeDao.sauvegarder(journees);
				List<Partie> parties = new ArrayList<Partie>();
				Partie partie = null;
				for (Journee savedJournee : savedJournees) {
					for (int i = 0; i < nbPartiesJournee; i++) {
						partie = new Partie();
						partie.setJournee(savedJournee);
						parties.add(partie);
					}
				}
				partieDao.sauvegarder(parties);
								
				return savedSaison;
			} catch (DaoException e) {
				throw new ServiceException(e.getMessage());
			}
		} else {
			throw new ServiceException("Nombre de club participants Incorrect");
		}
	}
}
